package hyl.core.data;

import java.util.concurrent.atomic.AtomicInteger;

import com.alibaba.fastjson.JSON;

/**
 * 可以累计执行次数的值容器
 */
public class ACValue<T> {
	String key; // 键
	T value; // 值
	AtomicInteger exectimes; // 执行次数

	public ACValue(String key, T value) {
		this.key = key;
		this.value = value;
		this.exectimes = new AtomicInteger(0);
	}

	// 如果重置 从零开始计算
	public void set(String key, T value) {
		this.key = key;
		this.value = value;
		this.exectimes.incrementAndGet();
	}

	public String getKey() {
		return this.key;
	}

	/**
	 * 会延迟过期时间
	 * 
	 * @return
	 */
	public T value() {
		incOne();
		return this.value;
	}

	// 注意json 会调用 getValue()
	/**
	 * 不会延迟过期时间
	 * 
	 * @return
	 */
	public T getValue() {
		return this.value;
	}

	/**
	 * 赋值时 标记使用次数+1
	 * 
	 * @param value
	 */
	public void setValue(T value) {
		incOne();
		this.value = value;
	}

	/*
	 * public byte[] getBytes() { return MyFst.serialize(this.value); }
	 */
	public byte[] getValueBytes() {
		return JSON.toJSONBytes(this.value);
	}
	public String getValueJSON() {
		return JSON.toJSONString(this.value);
	}
	public void decOne() {
		exectimes.decrementAndGet();
	}

	public void incOne() {
		exectimes.incrementAndGet();
	}

	public int getTimes() {
		return exectimes.intValue();
	}

}
